package demo1;

/**
 * 匿名内部类
 */
interface Inner {
    void func();
}

class A implements Inner {
    public void func() {
        System.out.println("重写func的方法");
    }
}

/**
 * 实例内部类:类内,一个只被class修饰的类
 *      1.类的成员变量
 *      2.类成员变量的访问:
 *          内部类方法访问成员变量1.访问自身类成员变量->this.成员变量名
 *          2.访问外部类成员变量名->外部类名.this.成员变量名
 */
class Outer {
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;
    class InnerClass {
        public int data1 = 111;
        public int data4 = 4;
        private int data5 = 5;
        public static final int data6 = 6;//如果实例内部类,必须要定义static成员变量,则必须是被static final修饰,因为是常量,编译的时候就确定了具体值

        public void func() {
            System.out.println("InnerClass::func");
            System.out.println(Outer.this.data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
    public void func() {
        InnerClass innerClass = new Outer().new InnerClass();
        System.out.println(innerClass.data4);//外部类访问内部类成员变量
        System.out.println("Outer::func");

    }
}
public class Test {
    public static void main(String[] args) {
        /**
         * 局部内部类:定义在成员方法中的类
         * 注意事项
         *      1.只能在所定义的方法体内内部使用
         *      2.不能被public static等修饰符修饰
         *      3.也有独立的字节码文件,文件格式为:外部类名字$数字内部类名字.class
         *      4.几乎不使用
         */
        class InnerClass {
            public void func() {
                System.out.println("局部内部类成员方法");
            }
        }
        InnerClass innerClass = new InnerClass();
        innerClass.func();
    }
    public static void main2(String[] args) {
        /**
         * 匿名内部类 new 接口/父类名(){重写抽象方法即可};
         */
        Inner inner = new Inner() {
            @Override
            public void func() {
                System.out.println("haha 不懂了吧~");
            }
        };

        inner.func();
    }
    public static void main1(String[] args) {
        Outer outer = new Outer();
        outer.func();
        /**
         * 实例化实例内部类
         * 类型:外部类.内部类
         * 创建对象:外部类对象.内部类成员
         */
        Outer.InnerClass innerClass = outer.new InnerClass();
        innerClass.func();
    }
}
